#include "grafo.h"
#include "common.h"
#include <ctime>
#include <iostream>

/*======================================================================
	Algoritmo por metaheuristica GRASP
------------------------------------------------------------------------

======================================================================*/

//Goloso constructivo randomizado. En goloso.cpp
extern vint golosoRandom(const Grafo &, const vint &, int, int);
//Busqueda local con cantidad de iteraciones y solucion inicial.
extern vint localConInicial(const Grafo &, const vint &, const vint &, int);

static int iteraciones,iteracionesLocal,porcentaje;

//Setter para la cantidad de iteraciones de GRASP.
void iteracionesGrasp(int iters){
	assert(iters > 0);
	iteraciones = iters;
}

//Setter para la cantidad de iteraciones de la busqueda local en GRASP.
void iteracionesLocalGrasp(int iters){
	assert(iters > 0);
	iteracionesLocal = iters;
}

//Setter para el porcentaje del goloso constructivo de GRASP.
void porcentajeGrasp(int porcent){
	assert(porcent > 0 && porcent <= 100);
	porcentaje = porcent;
}

//Solucion mediante la metaheuristica GRASP.
vint grasp(const Grafo & grafo, const vint & componente){
	
	unsigned int minimo = componente.size()+1; 
	vint solucion(componente.size()+1);
	
	for(int contador = iteraciones; contador >= 0; contador--){
		const vint & inicial = golosoRandom(grafo,componente,
					porcentaje,std::time(NULL));
		
		const vint & candidato = localConInicial(grafo,componente,
					inicial,iteracionesLocal);

		if(candidato.size() < minimo){
			minimo = candidato.size();
			contador = iteraciones+1;
			
			for(unsigned int i = 0; i < minimo; i++)
				solucion[i] = candidato[i];
		}
	}
	
	solucion.resize(minimo);
	return solucion;
}
